package com.stsdai.sso.service.impl;

import java.util.Date;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.stsdai.manager.mapper.UserMapper;
import com.stsdai.manager.pojo.User;
import com.stsdai.sso.redis.RedisUtils;
import com.stsdai.sso.service.UserService;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserMapper userMapper;

	@Override
	public Boolean check(String param, Integer type) {
		// 声明查询条件
		User user = new User();

		switch (type) {
		case 1:
			user.setUsername(param);
			break;
		case 2:
			user.setPhone(param);
			break;
		case 3:
			user.setEmail(param);
			break;

		default:
			break;
		}

		// 根据条件进行查询
		int count = this.userMapper.selectCount(user);

		// 如果count为0，表示没有查到，数据是可用，返回true
		// 反之返回false
		return count == 0;
	}

	@Autowired
	private RedisUtils redisUtils;

	@Value("${STSDAI_TICKET_KEY}")
	private String STSDAI_TICKET_KEY;

	private static final ObjectMapper MAPPER = new ObjectMapper();

	@Override
	public User queryUserByTicket(String ticket) {
		// 从redis中查询用户的登录信息，返回的是json格式的字符串
		// 需要给redis中的key增加前缀，方便redis的维护和管理
		String json = this.redisUtils.get(this.STSDAI_TICKET_KEY + ticket);

		// 判断查到的数据不为空
		if (StringUtils.isNotBlank(json)) {
			try {
				// 把查询到的json数据转为User对象
				User user = MAPPER.readValue(json, User.class);

				// 如果能执行到这里，表示用户有一次查询了自己的登录信息，用户是活动状态的
				// 需要重置redis的数据的有效时间
				this.redisUtils.expire(this.STSDAI_TICKET_KEY + ticket, 60 * 60);

				// 返回结果
				return user;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		// 如果查询到的结果是空，或者转换异常，返回null
		return null;
	}

	@Override
	public void doRegister(User user) {
		// 设置用户数据
		user.setCreated(new Date());
		user.setUpdated(user.getCreated());

		user.setPassword(DigestUtils.md5Hex(user.getPassword()));

		// 执行新增
		this.userMapper.insert(user);

	}

	@Override
	public String doLogin(User user) {
		// 根据条件查询用户信息
		user.setPassword(DigestUtils.md5Hex(user.getPassword()));
		User result = this.userMapper.selectOne(user);

		// 判断查询的结果是否为非空
		if (result != null) {
			// 如果为非空，表示登录成功，生成唯一的key，就是ticket
			// 可以利用redis单线程的特点，再加上incr每次加一，获取唯一数
			// 使用redis获取的唯一数，加上用户id拼接唯一数
			String ticket = "" + this.redisUtils.incr("STSDAI_TICKET_KEY") + result.getId();

			try {
				// 把ticket和用户信息保存到redis，设置数据的有效时间为1小时
				this.redisUtils.set(this.STSDAI_TICKET_KEY + ticket, MAPPER.writeValueAsString(result), 60 * 60);

				// 返回ticket
				return ticket;

			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		// 如果登录失败，或者有异常，返回null
		return null;
	}
}
